/**
 * @fileoverview Giant Interective Group, Inc. Javascript Library v#version.
 * 该Javascript UI库是基于jQuery的扩展。
 * <pre>
 * Copyright (C) 2004-2009 Giant Interective Group, Inc. All rights reserved.
 * 版权所有 2004-2009 上海巨人网络科技有限公司
 * </pre>
 * 
 * @version #version, #date
 * @author  Songlu
 */
if(typeof giant === 'undefined')
    var giant = {};

if(typeof giant.ui === 'undefined')
	giant.ui = {};

(function($) {
	var info = {
		//农历算法编码，1900-2049
		lunar: [0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0],
		//公历月天数
		solarMonth: [31,28,31,30,31,30,31,31,30,31,30,31],
		//天干
		gan: ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"],
		//地支
		zhi: ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"],
		//属相
		animals: ["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"],
		//二十四节气
		solarTerm: ["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"],
		//节气算法编码
		sTermInfo: [0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758],
		//公历节日
		sFtv: ["0101*元旦","0214 情人节","0308 妇女节","0312 植树节","0401 愚人节","0501 劳动节","0504 青年节","0512 护士节","0601 儿童节","0701 建党节","0801 建军节","0808 父亲节","0910 教师节","1001*国庆节","1225 圣诞节"],
		//农历节日
		lFtv: ["0101*春节","0115 元宵节","0505 端午节","0707 七夕情人节","0715 中元节","0815 中秋节","0909 重阳节","1208 腊八节","1224 小年","0100*除夕"],
		chaStr: ['日','一','二','三','四','五','六','七','八','九','十','十一','十二'],
		chaStr2: ['初','十','廿','卅','　'] 
	}

	/**
	 * 创建一个新的日历控件。
	 * 
	 * @class giant.ui.RichCalendar。Giant UI 的RichCalendar控件。
	 * @example
	 * <pre>
	 * // 将下面代码放入到页面
	 *	 &lt;div id="__calendar"&gt;
	 *		&lt;div id="__c_solar" style="float:left; font-weight:bold;"&gt;&lt;/div&gt;
	 *		&lt;div id="__c_lunar" style="float:right; font-weight:bold"&gt;&lt;/div&gt;
	 *		&lt;div class="clear"&gt;&lt;/div&gt;
	 *		&lt;table id="__c_solar_month" cellspacing="1" cellpadding="0"&gt;
	 *			&lt;thead&gt;
	 *				&lt;tr&gt;&lt;td&gt;日&lt;/td&gt;&lt;td&gt;一&lt;/td&gt;&lt;td&gt;二&lt;/td&gt;&lt;td&gt;三&lt;/td&gt;&lt;td&gt;四&lt;/td&gt;&lt;td&gt;五&lt;/td&gt;&lt;td&gt;六&lt;/td&gt;&lt;/tr&gt;
	 *			&lt;/thead&gt;
	 *			&lt;tbody&gt;
	 *			&lt;script language="javascript"&gt;
	 *			&lt;!--                                                                                                    
	 *            var num                                                                                                    
	 *            for(i=0;i&lt;6;i++) {                                                                                                    
	 *               document.write('&lt;tr align=center&gt;')                                                                                                    
	 *               for(j=0;j&lt;7;j++) {                                                                                                    
	 *                  num = i*7+j;                                                                                                    
	 *                  document.write('&lt;td id="__c_date_' + num +'"&gt;&lt;span id="__c_sDate_' + num +'" style="font-family:Arial Black;font-size:20px;')                                                                                                    
	 *                  if(j == 0) document.write(' color:red')                                                                                                    
	 *                  if(j == 6)                                                                                                    
	 *                     if(i%2==1) document.write(' color:red;')                                                                                                    
	 *                        else document.write(' color:red;')                                                                                                    
	 *                  document.write('" title=""&gt;0&lt;/span&gt;&lt;br/&gt;&lt;span id="__c_lDate_' + num + '"&gt;0&lt;/span&gt;&lt;/td&gt;')                                                                                                    
	 *               }                                                                                                    
	 *               document.write('&lt;/tr&gt;')                                                                                                    
	 *            }                                                                                                    
	 *			//--&gt;
	 *			&lt;/script&gt;
	 *			&lt;/tbody&gt;
	 *		&lt;/table&gt;
	 *		
	 *		&lt;div style="float:left;"&gt;
	 *			&lt;select id="__c_select_y"&gt;
	 *			&lt;script language=JavaScript&gt;
	 *			&lt;!--
	 *				for(i=1900;i&lt;2050;i++) document.write('&lt;option&gt;'+i)   
	 *			//--&gt;
	 *			&lt;/script&gt;
	 *			&lt;/select&gt;年
	 *			&lt;select id="__c_select_m"&gt;
	 *
	 *			&lt;script language=JavaScript&gt;
	 *			&lt;!-- 
	 *				for(i=1;i&lt;13;i++) document.write('&lt;option&gt;'+i)   
	 *			//--&gt;
	 *			&lt;/script&gt;
	 *			&lt;/select&gt;月
	 *		&lt;/div&gt;
	 *		&lt;div style="float:right;text-align:center;"&gt;
	 *			&lt;a href="javascript:void(0);" id="__c_btn_prev_y"&gt;上一年&lt;/a&gt;
	 *			&lt;a href="javascript:void(0);" id="__c_btn_prev_m"&gt;上一月&lt;/a&gt;
	 *			&lt;a href="javascript:void(0);" id="__c_btn_next_m"&gt;下一月&lt;/a&gt;
	 *			&lt;a href="javascript:void(0);" id="__c_btn_next_y"&gt;下一年&lt;/a&gt;
	 *		&lt;/div&gt;
	 *		&lt;script type="text/javascript"&gt;
	 *		$(document).ready(function(){
	 *			var options = { //若不需要绑定额外数据，仅创建一个日历控件的话，options参数可以不传
	 *				needBindData:true,	//是否绑定数据
	 *				url:'calendardata.txt',	//ajax请求数据的URL
	 *				dataType:'json'	//ajax请求的数据格式，目前只支持json
	 *			}
	 *			var richCalendar = new giant.ui.RichCalendar(options);
	 *		})
	 *		&lt;/script&gt;
	 * </pre>
	 * @constructor
	 * @param {Object} configs 日历的属性集。
	 */
	giant.ui.RichCalendar = function(configs){
		this.initRichCalendar(configs);	
	}

Object.extend(giant.ui.RichCalendar,
/** @lends giant.ui.Calendar */
{
	/**
	 * 计算指定月的天数(公历)。
     * @param {Number} year 要计算的年份。
     * @param {Number} month 要计算的月份。
     * @returns {Number} 返回指定月的天数。
	 */
	solarMonthDays: function(year, month){
		if(month==1)
			return(((year%4 == 0) && (year%100 != 0) || (year%400 == 0))? 29: 28);
		else
			return(info.solarMonth[month]);
	},
	/**
	 * 计算指定年的天数(农历)。
     * @param {Number} year 要计算的年份。
     * @returns {Number} 返回指定年份的天数。
	 */
	lYearDays: function(year){
		var i, sum = 348;
		for(i=0x8000; i>0x8; i>>=1) {
			sum += (info.lunar[year-1900] & i) ? 1 : 0;
		}
		return(sum+giant.ui.RichCalendar.lLeapDays(year));
	},
	/**
	 * 计算指定年份因为闰月而多出的天数(农历)。
     * @param {Number} year 要计算的年份。
     * @returns {Number} 返回指定年份因闰月而多出的天数，若指定年份不是闰年，则返回0。
	 */
	lLeapDays: function(year){
		if(giant.ui.RichCalendar.lLeapMonth(year))
			return((info.lunar[year-1900] & 0x10000) ? 30 : 29);
		else
			return(0);
	},
	/**
	 * 计算指定年份的闰月月份(农历)。
     * @param {Number} year 要计算的年份。
     * @returns {Number} 返回指定年份闰月月份，若该年份没有闰月，则返回0。
	 */
	lLeapMonth: function(year){
		return(info.lunar[year-1900] & 0xf);
	},
	/**
	 * 计算指定月的天数(农历)。
     * @param {Number} year 要计算的年份。
     * @param {Number} month 要计算的月份。
     * @returns {Number} 返回指定月的天数。
	 */
	lMonthDays: function(year, month){
		return((info.lunar[year-1900] & (0x10000>>month)) ? 30 : 29 );
	},
	/**
	 * 转换指定的公历日期。
     * @param {Date} sDate 要计算的公历日期对象。
     * @returns {Object} 返回一个包含农历信息的Object对象。
	 */
	getLunar: function(sDate){
		var Lunar = {};
		var i;
		var leap=0;
		var temp=0;
		var baseDate = new Date(1900,0,31);
		var offset = (sDate - baseDate)/86400000;

		Lunar.dayCyl = offset + 40;
		Lunar.monCyl = 14;

		for(i=1900; i<2050 && offset>0; i++) {
			temp = giant.ui.RichCalendar.lYearDays(i);
			offset -= temp;
			Lunar.monCyl += 12;
		}

		if(offset<0) {
			offset += temp;
			i--;
			Lunar.monCyl -= 12;
		}

		Lunar.year = i;
		Lunar.yearCyl = i-1864;

		leap = giant.ui.RichCalendar.lLeapMonth(i);
		
		Lunar.isLeap = false

		for(i=1; i<13 && offset>0; i++) {
      
			if(leap>0 && i==(leap+1) && Lunar.isLeap==false) {
				--i;
				Lunar.isLeap = true;
				temp = giant.ui.RichCalendar.lLeapDays(Lunar.year);
			} else {
				temp = giant.ui.RichCalendar.lMonthDays(Lunar.year, i);
			}

     
			if(Lunar.isLeap==true && i==(leap+1)) {
				Lunar.isLeap = false;
			}

			offset -= temp
			if(Lunar.isLeap == false) {
				Lunar.monCyl ++;
			}
		}

		if(offset==0 && leap>0 && i==leap+1)
			if(Lunar.isLeap) { 
				Lunar.isLeap = false;
			} else {
				Lunar.isLeap = true;
				--i;
				--Lunar.monCyl;
			}

		if(offset<0){
			offset += temp;
			--i;
			--Lunar.monCyl;
		}
		
		Lunar.month = info.chaStr[i];
		Lunar.month_num = i;
		Lunar.day = offset + 1;
		return Lunar;
	},
	/**
	 * 计算指定的数字对应的天干和地支。
     * @param {Number} num 要计算的数字。
     * @returns {String} 返回指定的数字对应的天干和地支。
	 */
	cyclical: function (num) {
		return(info.gan[num%10]+info.zhi[num%12])
	},
	/**
	 * 转换指定的日期的传统名称(农历)。
     * @param {Number} lDate 要转换的日期。
     * @returns {String} 返回指定的日期的传统名称。
	 */
	cDay: function(lDate){
		var s;

		switch (lDate) {
			case 10:
				s = '初十';
				break;
			case 20:
				s = '二十';
				break;
      		case 30:
				s = '三十';
				break;
      		default :
         		s = info.chaStr2[Math.floor(lDate/10)];
				s += info.chaStr[lDate%10];
		}
		return s;
	},
	/**
	 * 计算1900年后的二十四节气日期(公历)。
     * @param {Number} year 要计算的年份。
     * @param {Number} n 要计算的节气在二十四节气中的索引。
     * @returns {String} 返回指定年份指定节气的日期。
	 */
	sTerm: function (year,n) {
		var offDate = new Date( ( 31556925974.7*(year-1900) + info.sTermInfo[n]*60000  ) + Date.UTC(1900,0,6,2,5) )
		return(offDate.getUTCDate())
	}
	
});

giant.ui.RichCalendar.prototype = {
	/** 日历控件初始化。
     * @private
     */
	initRichCalendar: function(options){
		$this = this;
		
		options.today = new Date();
		
		options.tYear = options.today.getFullYear();
		options.tMonth = options.today.getMonth();
		options.tDate = options.today.getDate();
		
		options.cYear = options.tYear;
		options.cMonth = options.tMonth;
		options.cDate = options.tDate;
		
		options.objCalendar = null;
		
		options.elmCalendar = $('#__calendar');
		options.elmSolar = $('#__c_solar');
		options.elmLunar = $('#__c_lunar');
		options.elmSolarMonth = $('#__c_solar_month');
		options.elmBtnPrevYear = $('#__c_btn_prev_y');
		options.elmBtnPrevMonth = $('#__c_btn_prev_m');
		options.elmBtnNextYear = $('#__c_btn_next_y');
		options.elmBtnNextMonth = $('#__c_btn_next_m');
		options.elmSelectYear = $('#__c_select_y');
		options.elmSelectMonth = $('#__c_select_m');
		
		options.elmBtnPrevYear[0]['onclick'] = this.previousYear(options);
		options.elmBtnPrevMonth[0]['onclick'] = this.previousMonth(options);
		options.elmBtnNextYear[0]['onclick'] = this.nextYear(options);
		options.elmBtnNextMonth[0]['onclick'] = this.nextMonth(options);
		options.elmSelectYear[0]['onclick']= function(event){$this.eventStop(event);};
		options.elmSelectMonth[0]['onclick'] = function(event){$this.eventStop(event);};
		options.elmSelectYear[0]['onclick'] = this.lookup(options);
		options.elmSelectMonth[0]['onclick'] = this.lookup(options);
		
		$this.build(options.tYear, options.tMonth, options);
		$this.updateSolar(options.tYear, options.tMonth, options.tDate, options);
		$this.updateLunar(options.tYear, options.tMonth, options.tDate, options);
		
	},
	_build: function(year, month, options, data){
		//		_test1 = new Date();
		var sDObj, lDObj, lY, lM, lD=1, lL, lX=0, tmp1, tmp2;
		var lDPOS = [];
		var n = 0;
		var firstLM = 0;
		
		options.objCalendar = {};
		options.objCalendar.elements = [];

		sDObj = new Date(year,month,1)            //当月一日日期

		options.objCalendar.solarMonthDays = giant.ui.RichCalendar.solarMonthDays(year,month)    //公历当月天数
		options.objCalendar.firstWeek = sDObj.getDay()    //公历当月1日星期几

		for(var i=0;i<options.objCalendar.solarMonthDays;i++) {

			if(lD>lX) {
				sDObj = new Date(year,month,i+1)    //当月一日日期
				lDObj = giant.ui.RichCalendar.getLunar(sDObj)     //农历
				lY    = lDObj.year           //农历年
				lM    = lDObj.month          //农历月
	 			lD    = lDObj.day            //农历日
				lL    = lDObj.isLeap         //农历是否闰月
				lX    = lL?  giant.ui.RichCalendar.lLeapDays(lY):  giant.ui.RichCalendar.lMonthDays(lY,lM) //农历当月最後一天
	
				if(n==0) {
					firstLM = lM;
				}
				lDPOS[n++] = i-lD+1;
			}

			options.objCalendar.elements[i] = this.createCalElement(year,
																  month,
																  i+1,
																  info.chaStr[(i+options.objCalendar.firstWeek)%7],
																  lY,
																  lM,
																  lD++,
																  lL,
																  giant.ui.RichCalendar.cyclical(lDObj.yearCyl),
																  giant.ui.RichCalendar.cyclical(lDObj.monCyl),
																  giant.ui.RichCalendar.cyclical(lDObj.dayCyl++) )
		}
		
		tmp1=giant.ui.RichCalendar.sTerm(year,month*2  )-1
		tmp2=giant.ui.RichCalendar.sTerm(year,month*2+1)-1
		options.objCalendar.elements[tmp1].solarTerms = info.solarTerm[month*2]
		options.objCalendar.elements[tmp2].solarTerms = info.solarTerm[month*2+1]
		
		//公历节日
		for(var i=0; i<info.sFtv.length; i++) {
			var str = '';
			if(str=info.sFtv[i].match(/^(\d{2})(\d{2})([\s\*])(.+)$/)) {
				if(Number(str[1])==(month+1)) {
					options.objCalendar.elements[Number(str[2])-1].solarFestival = str[4] + ' ';
					if(str[3]=='*') {
						//TODO 重要节日做特殊处理
					}
				}
			}
		}
		
		//农历节日
		for(var i=0; i<info.lFtv.length; i++) {
			var str = '';
			if(str=info.lFtv[i].match(/^(\d{2})(.{2})([\s\*])(.+)$/)) {
				tmp1=Number(str[1])-firstLM;
				if(tmp1==-11) {
					tmp1=1;
				}
				if(tmp1 >=0 && tmp1<n) {
					tmp2 = lDPOS[tmp1] + Number(str[2]) -1;
					if( tmp2 >= 0 && tmp2<options.objCalendar.elements.length) {
						options.objCalendar.elements[tmp2].lunarFestival = str[4] + ' ';
						if(str[3]=='*') {
							//TODO 重要节日做特殊处理
						}
					}
				}
			}
		}
		//今日
		if(year==options.tYear && month==options.tMonth) {
			options.objCalendar.elements[options.tDate-1].isToday = true;
		}
		
		this.update(year, month, options, data);
	},
	/**
	 * 依据指定年份月份构建日历。
	 * @param {Number} year 公历年份。
	 * @param {Number} month 公历月份。
	 */
	build: function(year, month, options){
		var $this = this;
		if(options.needBindData){
			$.ajax({
				type:'GET',
				url: options.url,
				dataType: 'json',
				data: {
					'cYear':year,
					'cMonth': month
				},
				success: function(data){
					$this._build(year, month, options, data);
				}
			})
		} else {
			$this._build(year, month, options);
		}
	},
	/**
	 * 组件一个日期对象。
	 * @param {Number} sYear 公历年份。
	 * @param {Number} sMonth 公历月份。
	 * @param {Number} sDay 公历日份。
	 * @param {Number} lYear 农历日份。
	 * @param {Number} lMonth 农历日份。
	 * @param {Number} lDay 农历日份。
	 * @param {Number} isLeap 公历是否闰年。
	 * @param {Number} cYear 年份的天干地支。
	 * @param {Number} cMonth 月份的天干地支。
	 * @param {Number} cDay 日份的天干地支。
	 * @returns {JSON} 返回一个JSON对象
	 */
	createCalElement: function(sYear, sMonth, sDay, week, lYear, lMonth, lDay, isLeap, cYear, cMonth, cDay){
		return {sYear: sYear, sMonth: sMonth, sDay: sDay, week: week, lYear: lYear, lMonth: lMonth, lDay: lDay, isLeap: isLeap, cYear: cYear, cMonth: cMonth, cDay: cDay, lunarFestival: '', solarFestival: '', solarTerms:''}
	},
	/**
	 * 更新公历显示信息。
	 * @param {Number} year 公历年份。
	 * @param {Number} month 公历月份。
	 * @param {Number} date 公历日份。
	 */
	updateSolar: function(year, month, date, options){
		options.elmSolar.html('公历:' + 
							year + '年' + 
							(month+1) + '月' + 
							date + '日' + '&nbsp;&nbsp;' + 
							'星期' + info.chaStr[new Date(year, month, date).getDay()]);
	},
	/**
	 * 更新农历显示信息。
	 * @param {Number} year 公历年份。
	 * @param {Number} month 公历月份。
	 * @param {Number} date 公历日份。
	 */
	updateLunar: function(year, month, date, options){
		var cLunar = giant.ui.RichCalendar.getLunar(new Date(year, month, date));
		options.elmLunar.html('农历:' + 
							cLunar.month + '月' + 
							giant.ui.RichCalendar.cDay(cLunar.day));
	},
	/**
	 * 更新月历显示信息。
	 * @param {Number} year 公历年份。
	 * @param {Number} month 公历月份。
	 */
	update: function(year, month, options, data){
		var firstWeek = options.objCalendar.firstWeek;
		var sMonthDays = options.objCalendar.solarMonthDays;
		
		
		for(i=0;i<42;i++) {
			
			var sObj=$('#__c_sDate_'+ i);
			var lObj=$('#__c_lDate_'+ i);

			var dOfferset = i - firstWeek;
			var htm = '';
			sObj.css({'text-decoration':'','color':'#333'});
			sObj.attr('title','');
			sObj.parent().removeClass('today');
			sObj.parent().css({'cursor':'default'});
			lObj.css({'color':'','font-weight':''});
			if(dOfferset>-1 && dOfferset<sMonthDays) { 
				sObj.html(dOfferset+1);
				$.each(data.list, function(index, itm){
					if(dOfferset + 1 == itm.cDay){
						sObj.css({'text-decoration':'underline','color':'#06c'});
						sObj.attr('title',itm.type);
					}
				})
				sObj.parent().css({'cursor':'pointer'});
				if(options.objCalendar.elements[dOfferset].isToday) {
					sObj.parent().addClass('today');
				}

				if(options.objCalendar.elements[dOfferset].lDay==1) 
					lObj.html('<b>'+(options.objCalendar.elements[dOfferset].isLeap?'闰':'') 
									+ options.objCalendar.elements[dOfferset].lMonth + '月' 
									+ (giant.ui.RichCalendar.lMonthDays(options.objCalendar.elements[dOfferset].lYear,options.objCalendar.elements[dOfferset].lMonth)==29?'小':'大')+'</b>');
				else 
					lObj.html(giant.ui.RichCalendar.cDay(options.objCalendar.elements[dOfferset].lDay));

				var s = options.objCalendar.elements[dOfferset].lunarFestival;
				var htm = '';
				if(s && s.length>0) {//农历节日
					htm += s;
					if(s.length>6) {
						s = s.substr(0, 4)+'…';
						htm += s;
					}
					lObj.css({'color':'#f60','font-weight':'bold'});
				} 
				s = options.objCalendar.elements[dOfferset].solarFestival;
				
				if(s && s.length>0) {//公历节日
					htm += s;
					size = (s.charCodeAt(0)>0 && s.charCodeAt(0)<128)?8:4;
					if(s.length>size+2) {
						s =  s.substr(0, size)+'…';
						htm += s;
					}
					lObj.css({'color':'#06c','font-weight':'bold'});
				}
				s = options.objCalendar.elements[dOfferset].solarTerms;
				if(s && s.length>0) {//廿四节气
					lObj.css({'color':'#0c6','font-weight':'bold'});
					htm += s;
				}
				
				if(htm && htm.length>0) {
					lObj.html(htm);
				}
				
//				sObj.parent()[0]['onclick'] = this.callback(dOfferset);

			} else { //非日期
				sObj.html('&nbsp;');
				lObj.html('&nbsp;');
			}
		}
		
//		_test2 = new Date();
//		alert(_test2 - _test1);
	},
	/** 回调函数 */
	callback: function(index){
		$this = this;
		return function(event){
				var element = $this.objCalendar.elements[index];
				alert('你点击的是：' + element.sYear + '年' + element.sMonth + '月' + element.sDay + '日');
		}
	},
	/** 上一年 */
	previousYear: function(options){
		var $this = this;
		return function(event){
			$this.eventStop(event);
			if(options.cYear - 1 >= 1900)
				$this.build(--options.cYear, options.cMonth, options);
			$this.updateSolar(options.cYear, options.cMonth, options.cDate, options);
			$this.updateLunar(options.cYear, options.cMonth, options.cDate, options);
		}
	},
	/** 下一年 */
	nextYear: function(options){
		var $this = this;
		return function(event){
			$this.eventStop(event);
			if(options.cYear + 1 <= 2049)
				$this.build(++options.cYear, options.cMonth, options);
			$this.updateSolar(options.cYear, options.cMonth, options.cDate, options);
			$this.updateLunar(options.cYear, options.cMonth, options.cDate, options);
		}
	},
	/** 上一月 */
	previousMonth: function(options){
		var $this = this;
		return function(event){
			$this.eventStop(event);
			if(options.cMonth -1 >= 0){
				$this.build(options.cYear, --options.cMonth, options);
			} else {
				$this.cMonth = 11;
				if(options.cYear - 1 >= 1900)
					$this.build(--options.cYear, options.cMonth, options);
			}
			$this.updateSolar(options.cYear, options.cMonth, options.cDate, options);
			$this.updateLunar(options.cYear, options.cMonth, options.cDate, options);
		}
	},
	/** 下一月 */
	nextMonth: function(options){
		var $this = this;
		return function(event){
			$this.eventStop(event);
			if(options.cMonth + 1 <= 11) {
				$this.build(options.cYear, ++options.cMonth, options);
			} else {
				$this.cMonth = 0;
				if(options.cYear + 1 <= 2049)
					$this.build(++options.cYear, options.cMonth, options);
			}
			$this.updateSolar(options.cYear, options.cMonth, options.cDate, options);
			$this.updateLunar(options.cYear, options.cMonth, options.cDate, options);
		}
	},
	/** 通过下拉列表进行日期跳转 */
	lookup: function(options){
		$this = this;
		return function(event){
			options.cYear = Number(options.elmSelectYear[0][options.elmSelectYear[0].selectedIndex].innerHTML);
			options.cMonth = options.elmSelectMonth[0].selectedIndex
			$this.build(options.cYear , options.cMonth, options);
			$this.updateSolar(options.cYear, options.cMonth, options.cDate, options);
			$this.updateLunar(options.cYear, options.cMonth, options.cDate, options);
		}
	},
	/** 阻止事件冒泡 */
	eventStop: function(event){
		//如果提供了事件对象，则这是一个非IE浏览器
		if ( event && event.stopPropagation )
			//因此它支持W3C的stopPropagation()方法
			event.stopPropagation();
		else
			//否则，我们需要使用IE的方式来取消事件冒泡
			window.event.cancelBubble = true;
	}
}
})(jQuery);
